package chapter02;

import java.util.ArrayList;
import java.util.List;

public class SpiralOrder54 {
    /**
     * 以矩阵边界为一个整体 每次遍历矩阵边界
     * 左上角(startRow,startCol)  右下角(endRow,endCol)
     * 以四个角元素作为起点
     *  & * * &
     *  * * * *
     *  & * * &
     * 比如：
     * 1)遍历第一行
     *  j->[0,endCol-startCol) nums[startRow][startCol+j]
     * 2)遍历最后一列
     *  i->[0,endRow-startRow) nums[startRow+i][endCol]
     * 3)遍历最后一行
     *  j->[0,endCol-startCol) nums[endRow][endCol-j]
     * 4)遍历第一列
     *  i->[0,endRow-startRow) nums[endRow-i][startCol]
     * 5)特别情况
     *  满足这以下情况 以上就无需考虑
     *  a.只有一行 startRow==endRow
     *    只需遍历这一行
     *  b.只有一列 startCol==endCol
     *    只需遍历这一列
     * 每次遍历矩阵边界 改变矩阵边界 左上角++  右下角--
     * 循环条件：startRow<=endRow&&startCol<=endCol
     */
    List<Integer> list=new ArrayList<>();
    public List<Integer> spiralOrder(int[][] matrix) {
        int startRow=0;
        int startCol=0;
        int endRow= matrix.length-1;
        int endCol=matrix[0].length-1;
        while (startRow<=endRow&&startCol<=endCol){
            process(matrix,startRow,startCol,endRow,endCol);
            startRow++;
            startCol++;
            endRow--;
            endCol--;
        }
        return list;
    }

    public void process(int[][] matrix,int startRow,int startCol,int endRow,int endCol) {
        if(startRow==endRow){
            for(int i=startCol;i<=endCol;i++){
                list.add(matrix[startRow][i]);
            }
            return;
        }
        if(startCol==endCol){
            for(int i=startRow;i<=endRow;i++){
                list.add(matrix[i][startCol]);
            }
            return;
        }
        for(int i=0;i<endCol-startCol;i++){
            list.add(matrix[startRow][startCol+i]);
        }
        for(int i=0;i<endRow-startRow;i++){
            list.add(matrix[startRow+i][endCol]);
        }
        for(int i=0;i<endCol-startCol;i++){
            list.add(matrix[endRow][endCol-i]);
        }
        for(int i=0;i<endRow-startRow;i++){
            list.add(matrix[endRow-i][startCol]);
        }
    }
}
